/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladoras.apresentacao;
import telas.TelaGerenciaAeroporto;
import entidades.Aeroporto;
import entidades.Cidade;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import interfaces.IGerenciaAeroporto;
import controladoras.apresentacao.modelos.ModeloTabelaAeroporto;
import erros.ErroAtualizacao;

/**
 * Classe que implementa a controladora de interação de aeroporto.
 * @author thiagostuckert
 */
public class CntrIntAeroporto {
    /**
     * Atributo utilizado para a instanciação da controladora em questão.
     */
    private static CntrIntAeroporto ref;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na interface
     * de gerencia de aeroporto.
     */
    private IGerenciaAeroporto cntrGerenciaAeroporto;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na tela
     * de gerencia de aeroporto.
     */
    private TelaGerenciaAeroporto telaGerenciaAeroporto;
    /**
     * Atributo utilizado para a chamada dos metodos definidos no modelo
     * da tabela de gerencia de aeroporto.
     */
    private ModeloTabelaAeroporto modeloTabelaAeroporto;
    /**
     * Atributo utilizado para a apresentação de todos aeroportos
     * já existentes.
     */
    private ArrayList aeroportosParam = new ArrayList();
    /**
     * Atributo utilizado para a edição dos aeroportos já existentes.
     */
    private ArrayList listaAeroportos = new ArrayList();

    /**
     * Metodo que dispara a apresentação a tela de gerencia de aeroporto.
     */
    public final void mostrarTelaGerenciaAeroporto() {
        try {
            telaGerenciaAeroporto = TelaGerenciaAeroporto.instanciar();
            telaGerenciaAeroporto.setControladoraInteracao(this);
            modeloTabelaAeroporto = ModeloTabelaAeroporto.instanciar();
            aeroportosParam = cntrGerenciaAeroporto.recuperarAeroportos();
            copiaLista();
            modeloTabelaAeroporto.setRows(aeroportosParam);
            telaGerenciaAeroporto.setVisible(true);
        } catch (Exception e) {
           JOptionPane.showMessageDialog(telaGerenciaAeroporto,
                     e.getMessage());
        }
    }

    /**
     * Metodo que copia o conteudo de um ArrayList para outro.
     */
    public final void copiaLista() {
        for (int i = 0; i < aeroportosParam.size(); i++) {
            Aeroporto aeroporto = new Aeroporto(((Aeroporto) aeroportosParam.
                    get(i)).getCodigoAeroporto());
            listaAeroportos.add(aeroporto);
        }
    }
    /**
     * Metodo que atribui uma controladora a outra.
     * @param cntrGerenciaAeroportoParam controladora a ser atribuida.
     */
    public final void setCntrGerenciaAeroporto(
            final IGerenciaAeroporto  cntrGerenciaAeroportoParam) {
        cntrGerenciaAeroporto = cntrGerenciaAeroportoParam;
    }

    /**
     * Metodo que instancia a contraladora de interação de aeroporto.
     * @return Controladora de interação de Aeroporto instanciada
     */
    public static CntrIntAeroporto instanciar() {
        if (ref == null) {
            ref = new CntrIntAeroporto();
        }
        return ref;
    }

    /**
    * Metodo que chama a controladora de negócio para a adição de aeroporto.
    * @param codigoAeroporto codigo do aeroporto a ser adicionado
    * @param nomeCidade nome da cidade do aeroporto a ser adicionado
    */
    public final void addAeroporto(final String codigoAeroporto, final
            String nomeCidade) {
        modeloTabelaAeroporto = ModeloTabelaAeroporto.instanciar();
        try {
            Aeroporto aeroporto = new Aeroporto(codigoAeroporto);
            Cidade cidade = new Cidade(nomeCidade);
            cntrGerenciaAeroporto.cadastrarAeroporto(aeroporto, cidade);
            modeloTabelaAeroporto.addRow(aeroporto);
            JOptionPane.showMessageDialog(telaGerenciaAeroporto,
                     "Aeroporto cadastrado com sucesso");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(telaGerenciaAeroporto,
                     e.getMessage());
        }
    }
    /**
     * Método que chama a controladora de negócio para a remoção
     * de aeroporto.
     * @param linha linha da tabela onde está o aeroporto
     * a ser removido.
     */
    public final void delAeroporto(final int linha) {
        modeloTabelaAeroporto = ModeloTabelaAeroporto.instanciar();
        try {
            Aeroporto aeroporto = new Aeroporto((String) modeloTabelaAeroporto.
                    getValueAt(linha, linha));
            cntrGerenciaAeroporto.deletarAeroporto(aeroporto);
            modeloTabelaAeroporto.delRow(linha);
            JOptionPane.showMessageDialog(telaGerenciaAeroporto,
                     "Aeroporto deletado com sucesso");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(telaGerenciaAeroporto,
                     e.getMessage());
        }
    }

    /**
     * Metodo que fecha a tela de gerencia de aeroporto.
     */
    public final void encerrar() {
        telaGerenciaAeroporto.setVisible(false);
    }

    /**
     * Metodo que chama a controladora de negocio para atualização
     * de aeroporto.
     * @param aeroVelho Aeroporto a ter seus dados atualizados.
     * @param aeroNovo Aeroporto com os novos dados.
     * @throws erro é tratado na classe modelo da tabela.
     */
     public final void upAeroporto(final Aeroporto aeroVelho,
             final Aeroporto aeroNovo) throws ErroAtualizacao{
        cntrGerenciaAeroporto.atualizarAeroporto(aeroVelho, aeroNovo);
        JOptionPane.showMessageDialog(telaGerenciaAeroporto,
                     "Aeroporto alterado com sucesso");
    }
}
